﻿#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
using namespace std;
class A
{
public:

	//构造
	A(int a = 0)
		:_a1(a)
	{
		cout << "A(int a)" << endl;
	}
	//拷贝构造
	A(const A& aa)
		:_a1(aa._a1)
	{
		cout << "A(const A& aa)" << endl;
	}
	//重载
	A& operator = (const A & aa)
	{
		cout << "A& operate=(const A& aa)" << endl;
		if (this != &aa)
		{
			_a1 = aa._a1;
		}
			return *this;
	}
	//析构
	~A()
	{
		cout << "~A" << endl;
	}
private:
	int _a1 = 1;
};
void f1(A aa)
{}
A f2()
{
	A aa;
	return aa;
}
int main()
{
	A aa1;
	// 返回时⼀个表达式中，连续拷⻉构造+拷⻉构造->优化⼀个拷⻉构造 （vs2019 debug） 
   // ⼀些编译器会优化得更厉害，进⾏跨⾏合并优化，将构造的局部对象aa和拷⻉的临时对象和接收返回值对象aa2优化为⼀个直接构造。（vs2022 debug）
	A aa2 = f2();
	cout << endl;
	// ⼀个表达式中，开始构造，中间拷⻉构造+赋值重载->⽆法优化（vs2019 debug） 
	// ⼀些编译器会优化得更厉害，进⾏跨⾏合并优化，将构造的局部对象aa和拷⻉临时对象合并为⼀个直接构造（vs2022 debug）
	aa1 = f2();
	cout << endl;
	return 0;
}








//int main()
//{    // 传值返回 
//    // 不优化的情况下传值返回，编译器会⽣成⼀个拷⻉返回对象的临时对象作为函数调⽤表达式的返回值
//	// ⽆优化 （vs2019 debug） 
//	// ⼀些编译器会优化得更厉害，将构造的局部对象和拷⻉构造的临时对象优化为直接构造（vs2022 debug）
//	f2();
//	return 0;
//}









//int main()
//{// ⼀个表达式中，连续构造+拷⻉构造->优化为⼀个构造 
//	f1(A(2));
//	return 0;
//}











//int main()
//{
//	// 隐式类型，连续构造+拷⻉构造->优化为直接构造
//	f1(1);
//	return 0;
//}







































//int main()
//{
//	// 传值传参 
//    // 构造+拷⻉构造 
//	A aa1;
//	f1(aa1);
//	cout << endl;
//	return 0;
//}






















